package com.lam.system.util;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import com.lam.common.constant.CommonConstant;
import com.lam.common.constant.SystemConstant;
import com.lam.common.utils.CollectionUtil;
import com.lam.common.utils.NumberUtil;
import com.lam.common.utils.StringUtils;
import com.lam.system.domain.MetaVo;
import com.lam.system.domain.RouterVo;
import com.lam.system.entity.SysMenu;

public class MenuUtil {
	
	public static final String MENU_TOP_ID = CommonConstant.TOP_PARENT_ID;
	
	/**
	 * 处理错误数据，简化用户失误操作
	 */
	public static SysMenu initMenu(SysMenu sysMenu) {
		
		if (sysMenu == null) {
			return null;
		}

		// 组件
		if (StringUtils.isNotBlank(sysMenu.getComponent())) {
			String component = sysMenu.getComponent();
			if (component.startsWith("/")) {
				component = component.substring(1);
			}
			if (component.startsWith("views/")) {
				component = component.replaceFirst("views/", "");
			}
			if (component.startsWith("src/views/")) {
				component = component.replaceFirst("src/views/", "");
			}
			if (component.endsWith(".vue")) {
				component = component.replace(".vue", "");
			}
			sysMenu.setComponent(component);
		}
		
		// 请求路径
		String path = sysMenu.getPath();
		if (StringUtils.isNotBlank(path)) {
			
			if (path.endsWith(".vue")) {
				path = path.replace(".vue", "");
			}
//			if (!path.startsWith("http") && !path.startsWith("/")&&!path.trim().startsWith("{{")) {
//				path = "/" + path;
//			}
			sysMenu.setPath(path);
		}
		
		// 一级菜单默认组件
		if (isTopDir(sysMenu) && StringUtils.isBlank(sysMenu.getComponent())) {
			// 一级菜单默认组件
			sysMenu.setComponent(null);
		}
		return sysMenu;
	}
	
//	/**
//	 * 构建前端所需要下拉树结构
//	 * 
//	 * @param menus 菜单列表
//	 * @return 下拉树结构列表
//	 */
//	public static List<DefaultSelectTree> buildMenuTreeSelect(List<SysMenu> menus) {
//		List<SysMenu> menuTrees = TreeUtil.buildTree(menus, MENU_TOP_ID);
//		return menuTrees.stream().map(DefaultSelectTree::new).collect(Collectors.toList());
//	}
	
	public static List<RouterVo> buildMenus(List<SysMenu> menuTree) {
		List<RouterVo> routers = new LinkedList<>();
		for (SysMenu menu : menuTree) {
			if(!NumberUtil.eq(SystemConstant.MENU_TYPE_DIR, menu.getMenuType()) && !NumberUtil.eq(SystemConstant.MENU_TYPE_PAGE, menu.getMenuType())) {
				continue;
			}
			RouterVo router = new RouterVo();
			router.setHidden(NumberUtil.eq(CommonConstant.YES1, menu.getHidden()));
			router.setName(getRouteName(menu));
			router.setPath(getRouterPath(menu));
			router.setComponent(getComponent(menu));
			router.setMeta(new MetaVo(menu.getName(), menu.getIcon()));
			if (CollectionUtil.isNotEmpty(menu.getChildren()) && NumberUtil.eq(SystemConstant.MENU_TYPE_DIR, menu.getMenuType())) {
				router.setAlwaysShow(true);
				router.setRedirect("noRedirect");
				router.setChildren(buildMenus(menu.getChildren()));
			} else if (isTopPage(menu)) {
				List<RouterVo> childrenList = new ArrayList<>();
				RouterVo children = new RouterVo();
				children.setPath(menu.getPath());
				children.setComponent(menu.getComponent());
				children.setName(StringUtils.capitalize(menu.getPath()));
				children.setMeta(new MetaVo(menu.getName(), menu.getIcon()));
				childrenList.add(children);
				router.setChildren(childrenList);
			}
			routers.add(router);
		}
		return routers;
	}
	
	/**
	 * 获取路由地址
	 * 
	 * @param menu 菜单信息
	 * @return 路由地址
	 */
	public static String getRouterPath(SysMenu menu) {
		String routerPath = menu.getPath();
		// 非外链并且是一级目录（类型为目录）
		if (isTopDir(menu)) {
			routerPath = "/" + menu.getPath();
		}else if (isTopPage(menu)) {
			// 非外链并且是一级目录（类型为菜单）
			routerPath = "/";
		}
		return routerPath;
	}

	/**
	 * 获取组件信息
	 * 
	 * @param menu 菜单信息
	 * @return 组件信息
	 */
	public static String getComponent(SysMenu menu) {
		String component = menu.getComponent();
		if(isDir(menu) && !isTopDir(menu)) {
			component = SystemConstant.SUB_DIR_MENU;
		}else if(isTopPage(menu) || StringUtils.isBlank(menu.getComponent())) {
			component = SystemConstant.LAYOUT;
		}
		return component;
	}

	
	/**
	 * 获取路由名称
	 * 
	 * @param menu 菜单信息
	 * @return 路由名称
	 */
	public static String getRouteName(SysMenu menu) {
		String routerName = StringUtils.capitalize(menu.getPath());
		// 非外链并且是一级目录（类型为目录）
		if (isTopPage(menu)) {
			return StringUtils.EMPTY;
		}
		return routerName;
	}
	
	/**
	 * 一级目录组件
	 */
	public static boolean isTopDir(SysMenu menu) {
		return StringUtils.equals(menu.getParentId(), MENU_TOP_ID) && isDir(menu);
	}
	
	/**
	 * 目录组件
	 */
	public static boolean isDir(SysMenu menu) {
		return NumberUtil.eq(SystemConstant.MENU_TYPE_DIR, menu.getMenuType())
				&& NumberUtil.eq(SystemConstant.MENU_PATH_TYPE_INNER, menu.getPathType());
	}

	/**
	 * 一级页面组件
	 */
	public static boolean isTopPage(SysMenu menu) {
		return StringUtils.equals(menu.getParentId(), MENU_TOP_ID) && isPage(menu);
	}
	
	/**
	 * 页面组件
	 */
	public static boolean isPage(SysMenu menu) {
		return NumberUtil.eq(SystemConstant.MENU_TYPE_PAGE, menu.getMenuType())
				&& NumberUtil.eq(SystemConstant.MENU_PATH_TYPE_INNER, menu.getPathType());
	}
	
	/**
	 * 按钮
	 */
	public static boolean isButton(SysMenu menu) {
		return NumberUtil.eq(SystemConstant.MENU_TYPE_BUTTON, menu.getMenuType());
	}
}
